package com.gz.common.mongodb.dao;

import com.gz.common.mongodb.utils.Mongo;
import com.gz.common.mongodb.base.MongoBaseModel;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

/**
 * @ClassName MongoUpdateMapper
 * @Description // 提供文档修改的方法
 * @Author WHX
 * @Date 2021/9/19 20:24
 **/
public interface MongoUpdateMapper<Model, ID> extends MongoGetTClass<Model> {


    /**
     * 根据主键ID修改，非null值的字段
     * <p>
     * 注意：仅支持的字段类型为：基本类型，或基本类型的包装类，或字符串
     * 构建条件时，会忽略集合类型以及其他引用类型
     * @param model
     */
    default void updateByPrimaryKeySelective(MongoBaseModel model){
        Update update = Mongo.getSelectiveUpdate(model);
        Mongo.mongoTemplate().updateFirst(Query.query(Criteria.where("id").is(model.getId())), update, this.getTClass());
    }

    /**
     * 根据主键ID修改
     * @param id
     * @param update
     */
    default void updateByPrimaryKey(ID id, Update update){
        Mongo.mongoTemplate().updateFirst(Query.query(Criteria.where("id").is(id)), update, this.getTClass());
    }

    /**
     * 只修改符合条件的第一条数据
     * @param criteria
     * @param update
     */
    default void update(Criteria criteria, Update update){
        Mongo.mongoTemplate().updateFirst(new Query(criteria), update, this.getTClass());
    }


    /**
     * 批量修改符合条件的数据 + 动态构建修改字段
     * @param models
     */
    default void updateBatch(List<MongoBaseModel> models){
        for (MongoBaseModel model : models) {
            this.updateByPrimaryKeySelective(model);
        }
    }

    /**
     * 批量修改符合条件的数据
     * @param criteria
     * @param update
     */
    default void updateBatch(Criteria criteria, Update update){
        Mongo.mongoTemplate().updateMulti(new Query(criteria), update, this.getTClass());
    }
}
